#ifndef JSON_WRAPPER_H
#define JSON_WRAPPER_H

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "cJSON.h"

// ====================
// 类型定义
// ====================

typedef struct JsonObject JsonObject;
typedef struct JsonArray JsonArray;

// ====================
// 内存管理
// ====================

void json_free(void *json);

// ====================
// JSON 对象操作
// ====================

JsonObject *json_object_create();
JsonObject *json_object_parse(const char *json_str);
char *json_object_to_string(JsonObject *obj, bool formatted);
bool json_object_save_to_file(JsonObject *obj, const char *filename);

void json_object_put_string(JsonObject *obj, const char *key, const char *value);
void json_object_put_number(JsonObject *obj, const char *key, double value);
void json_object_put_bool(JsonObject *obj, const char *key, bool value);
void json_object_put_null(JsonObject *obj, const char *key);
void json_object_put_object(JsonObject *obj, const char *key, JsonObject *value);
void json_object_put_array(JsonObject *obj, const char *key, JsonArray *value);

const char *json_object_get_string(JsonObject *obj, const char *key, const char *default_value);
double json_object_get_number(JsonObject *obj, const char *key, double default_value);
bool json_object_get_bool(JsonObject *obj, const char *key, bool default_value);
JsonObject *json_object_get_object(JsonObject *obj, const char *key);
JsonArray *json_object_get_array(JsonObject *obj, const char *key);

// ====================
// JSON 数组操作
// ====================

JsonArray *json_array_create();
JsonArray *json_array_parse(const char *json_str);
int json_array_size(JsonArray *array);

void json_array_append_string(JsonArray *array, const char *value);
void json_array_append_number(JsonArray *array, double value);
void json_array_append_bool(JsonArray *array, bool value);
void json_array_append_null(JsonArray *array);
void json_array_append_object(JsonArray *array, JsonObject *value);
void json_array_append_array(JsonArray *array, JsonArray *value);

const char *json_array_get_string(JsonArray *array, int index, const char *default_value);
double json_array_get_number(JsonArray *array, int index, double default_value);
bool json_array_get_bool(JsonArray *array, int index, bool default_value);
JsonObject *json_array_get_object(JsonArray *array, int index);
JsonArray *json_array_get_array(JsonArray *array, int index);

#endif // JSON_WRAPPER_H